package com.xnx3.banmahuishou.userApplet.util;

import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.ObjectUtils;

import com.xnx3.banmahuishou.core.entity.Agency;

/**
 * 用户位置相关工具类
 * @author qyw
 */
public class UserLocationUtil {

	/**
	 * 获取传入的省市区所在的代理商ID,没有则返回0
	 * @param sheng		省
	 * @param shi		市
	 * @param qu		区
	 * @param list		代理商列表
	 * @return	代理商的后台用户ID,0代表没有代理商
	 */
	public static int getDlsUserid(String sheng,String shi,String qu,List<Agency> list) {

		for (Agency agency : list) {
			// 省代理
			if (ObjectUtils.equals(agency.getSheng(), sheng) && ObjectUtils.equals(agency.getShi(), "全部")) {
				return agency.getUserid();
			}
			// 市\区代理
			if (ObjectUtils.equals(agency.getSheng(), sheng) && !ObjectUtils.equals(agency.getShi(), "全部")) {
				// 获取有几个市
				String[] shis = agency.getShi().split(",");
				if (shis.length == 1) {
					// 一个市且和用户的市吻合且区是 全部
					if (ObjectUtils.equals(shis[0], shi) && ObjectUtils.equals(agency.getQu(), "全部")) {
						return agency.getUserid();
					}
					// 一个市且和用户的市吻合且用户的区在该代理商的区里
					if (ObjectUtils.equals(shis[0], shi) && !ObjectUtils.equals(agency.getQu(), "全部")) {
						// 获取有几个区
						String[] qus = agency.getQu().split(",");
						for (String string : qus) {
							if (ObjectUtils.equals(string, qu)) {
								return agency.getUserid();
							}
						}
					}
				}else if (shis.length > 1) {
					// 多个市且其中一个和用户的市吻合且区是 全部
					for (String string : shis) {
						if (ObjectUtils.equals(string, shi)) {
							if (ObjectUtils.equals(agency.getQu(), "全部")) {
								return agency.getUserid();
							}
						}
					}
				}
			}
		}
		return 0;
	}
	
	
	
	
	/**
	 * 判断某坐标点是否在某区域
	 * @param pointLon 		要判断的点的横坐标 经度
	 * @param pointLat 		要判断的点的纵坐标 纬度
	 * @param locations		网格服务区域 格式: [{121.22,33.322},{131.22,31.312}] 
	 * @return true  false
	 */
	public static Boolean isWgLocation(double pointLon, double pointLat,String locations) {
		
		String substring = locations.substring(2, locations.length() - 2);
		// 获取经纬度数组
		String[] locationsSplit = substring.split("\\}\\,\\{");
		// 经度数组
		Double[] lon = new Double[locationsSplit.length];
		// 纬度数组
		Double[] lat = new Double[locationsSplit.length];
		// 遍历经纬度数组
		for (int i = 0; i < locationsSplit.length; i++) {
			// 把经纬度拆出来
			String string = locationsSplit[i];
			String[] split = string.split(",");
			Double lonDouble = Double.valueOf(split[0]);
			lon[i] = lonDouble;
			Double latDouble = Double.valueOf(split[1]);
			lat[i] = latDouble;
		}
		// 是否在该区域内
		boolean b = isInPolygon(pointLon,pointLat, lon, lat);
		return b;
	}
	
	
	
	
	/**
	 * 判断是否在多边形区域内
	 *
	 * @param pointLon 要判断的点的横坐标 经度
	 * @param pointLat 要判断的点的纵坐标 维度
	 * @param lon      区域各顶点的横坐标数组
	 * @param lat      区域各顶点的纵坐标数组
	 * @return
	 */
	public static boolean isInPolygon(double pointLon, double pointLat, Double[] lon,
			Double[] lat) {
		// 将要判断的横纵坐标组成一个点
		Point2D.Double point = new Point2D.Double(pointLon, pointLat);
		// 将区域各顶点的横纵坐标放到一个点集合里面
		List<Point2D.Double> pointList = new ArrayList<Point2D.Double>();
		double polygonPoint_x = 0.0, polygonPoint_y = 0.0;
		for (int i = 0; i < lon.length; i++) {
			polygonPoint_x = lon[i];
			polygonPoint_y = lat[i];
			Point2D.Double polygonPoint = new Point2D.Double(polygonPoint_x, polygonPoint_y);
			pointList.add(polygonPoint);
		}
		return check(point, pointList);
	}

	/**
	 * @param point   要判断的点的横纵坐标
	 * @param polygon 组成的顶点坐标集合
	 * @return
	 */
	private static boolean check(Point2D.Double point, List<Point2D.Double> polygon) {
		java.awt.geom.GeneralPath peneralPath = new java.awt.geom.GeneralPath();

		Point2D.Double first = polygon.get(0);
		// 通过移动到指定坐标（以双精度指定），将一个点添加到路径中
		peneralPath.moveTo(first.x, first.y);
		polygon.remove(0);
		for (Point2D.Double d : polygon) {
			// 通过绘制一条从当前坐标到新指定坐标（以双精度指定）的直线，将一个点添加到路径中。
			peneralPath.lineTo(d.x, d.y);
		}
		// 将几何多边形封闭
		peneralPath.lineTo(first.x, first.y);
		peneralPath.closePath();
		// 测试指定的 Point2D 是否在 Shape 的边界内。
		return peneralPath.contains(point);
	}

}
